[入門] AWSのネットワークとAutoScalingなWebサーバーを作るハンズオンを作りました
どうも、もこ@札幌オフィスです。
この記事はN高等学校 Advent Calendar 2020の2日目の記事となります。
今年からフルタイムで仕事をする傍らN高でお世話になっておりますので、AWS関連のエントリーを出させて頂きます。
本記事はAWSを学ぼうとされている方や基礎から学び直そうとしている方に向けて、AWSのネットワークとALB+AutoScaling+EC2を実際にAWS環境を作りながら解説していくハンズオンのような記事となっています。
完成像
早速とはなりますが、完成像を用意しました。
VPC, Subnet, RouteTable, Internet Gatewayを用いた一般的なAWSのネットワーク入門と、EC2, AMI, Application Load Balancer(ELB) を用いた一般的なWebサーバーの構成を実際にAWS環境で作って入門していきます。
AWSのネットワークの基礎
それでは早速、ネットワークについて入門していきましょう。
AWSを語る上では欠かせない、「Amazon VPC」とは、論理的に分離されている仮想プライベートネットワークを提供するサービスです。
VPCの詳細な仕組みについて語り出したらそれだけで終わってしまいそうなので割愛しますが、VPCにて作成したネットワーク上に「サブネット」を作成した上で、AWSサービスを展開していくのが基本です。
AWSではデフォルトで「Default VPC」が作成されていてすぐにEC2が起動できる環境が整っていますが、実際の環境ではDefault VPCを使う機会はほぼないので、1からの設定とはなりますが、基礎中の基礎を学べると思うので是非お付き合いください。
VPCを作る
早速VPCを作っていきましょう。
AWSマネジメントコンソールで東京リージョンが選択されていることを確認してVPCを選択して、名前タグとVPC内で扱えるIPアドレスレンジ(CIDR)を指定します。
今回は10.0.0.0/16としました。
作成しますと、現在のAWS環境の状態はこうなります。
サブネットを作る
続きまして、サブネットを作成していきます。
「サブネット」とは、VPC内で更に論理的に分割したネットワークを指します。
ここでたまに「パブリックサブネット」と「プライベートサブネット」という単語を耳にしたことがあるかと思いますが、これらの違いは「サブネットからインターネットに出れるか、出られないか」となります。
パブリックサブネットとプライベートサブネットの詳細についてはルートテーブルを作成するタイミングで解説しますので、ひとまずサブネットを4個作っていきましょう。
サブネット作成画面に行き、先程作成したVPCを指定しつつ、下記のパラメーターで4個のサブネットを作ってみます。
サブネット名 | アベイラビリティーゾーン | IPv4 CIDR Block |
---|---|---|
demo-public-a | ap-northeast-1a | 10.0.0.0/24 |
demo-public-c | ap-northeast-1c | 10.0.1.0/24 |
demo-private-a | ap-northeast-1a | 10.0.10.0/24 |
demo-private-c | ap-northeast-1c | 10.0.11.0/24 |
ここで指定する「アベイラビリティーゾーン」は、「リージョン内でさらに独立して分離されたデータセンター群の事」と捉えて頂ければOKです。
各アベイラビリティーゾーンは物理的に一定距離離れており、落雷、地震などの電源やその他のインフラストラクチャを共有していないため、複数のアベイラビリティーゾーンを使う構成(MultiAZ)を取ると、万が一1個のアベイラビリティーゾーンが落ちても高い可用性を得ることが出来ます。
また、VPCは複数のアベイラビリティーゾーンに跨がってリージョン単位で作成出来るのに対して、サブネットはアベイラビリティーゾーン単位で作成する必要があります。
そんなわけで、サブネットを4つ作成しました。
現在の構成はこんな感じで、VPC内にサブネットが4つ作成された構成になります。
インターネットゲートウェイを作る
インターネットゲートウェイは、VPCとインターネットとのゲートウェイで、VPC内からインターネット、インターネットからVPCへの通信の経路となるゲートウェイです。
こちらに関してもマネジメントコンソールから、インターネットゲートウェイを作成して、作成したインターネットゲートウェイをVPCにアタッチします。
ルートテーブルを設定する
続きまして、インターネットゲートウェイへの経路を設定してきます。ルートテーブルではサブネット単位でルーティングを行えます。
インターネットゲートウェイへの経路を作成してあげることで、先程ご紹介した「パブリックサブネット」となり、逆にインターネットゲートウェイへの経路がないサブネットを「プライベートサブネット」と呼びます。
プライベートサブネットには、一般的にはインターネットに接続する必要が無いEC2やRDS(DB)などを配置するために活用します。
さて、早速パブリックサブネットを作ってみましょう。 demo-public-rtb
を作成して、先程作成した demo-public-a
と demo-public-c
サブネットを関連付けます。
続いて、ルートを編集していきます。
0.0.0.0/0(全てのIP)のルートをインターネットゲートウェイへ向けて、インターネットゲートウェイへの経路を設定してあげます。
こうすることで、ルートテーブルに関連付けた demo-public-a
と demo-public-c
サブネットがインターネットへ繋がるようになりました!
次のステップでは、早速インターネット越しでEC2にSSHしてみます。
パブリックサブネットでインスタンスを作ってみる
ここまで、ネットワーク周りの少々地味な作業が続いてきましたが、やっと本題、EC2を作ってみます。
Amazon Elastic Compute Cloud(Amazon EC2)は名前の通り、Linux/Windowsなどを起動出来るコンピューティングリソースを提供できるサービスです。
AWSマネジメントコンソールからインスタンスを作成ボタンを押すと、インスタンスウィザードが開かれます。最初の画面ではAMI(Amazon Machine Image、OSやボリュームなどを含むイメージ)を選択する事が出来ます。必要に応じてWindowsやRHEL、Ubuntuなど様々なOSを選択できますが、今回はAWSが提供するAmazon Linux 2を選択します。
適当なインスタンスタイプを選択後、インスタンスの詳細設定を行います。
設定が必要なのが赤枠で囲った3カ所、VPCとサブネットを作成した物に設定して、自動割り当てパブリックIPアドレスを有効化します。
ストレージとタグ設定を飛ばして、お次はセキュリティグループの設定。
ポート開放などの作業は、ufwやiptablesで行うことができたかと思いますが、AWSではSecurity Groupを用いることで、インスタンス(サービス)の前段でトラフィックを制限する事ができます。
今回はHTTPをフルオープン、SSHを自分のIPアドレスで絞りました。
既にキーペアがある場合は選択、なければあたらに作成してインスタンスを作成します!
30秒ほどすると、指定したサブネットでEC2が立ち上がってくるのを確認できます!
EC2にSSHしてみる
Amazon Linuxではec2-userでログインする事ができるので、早速SSHしていきます
$ ssh ec2-user@13.231.155.98 -i hoge.pem The authenticity of host '13.231.155.98 (13.231.155.98)' can't be established. ECDSA key fingerprint is SHA256:5STpG3AzfmFSAHg5Qnpt5mfWBPPvK3pRj0RoepbJWSE. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '13.231.155.98' (ECDSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/ [ec2-user@ip-10-0-0-138 ~]$
無事、パブリックサブネットに起動したEC2にSSH出来る事を確認できるかと思います。
こちらにNginxをインストールして、HTTPでアクセス出来るかを試してみましょう。
# nginxをinstall $ sudo amazon-linux-extras install nginx1 -y $ sudo nginx
OKですね!これでWebサーバーを作るという目的自体は完了しましたが、せっかくここまで作ってきたので、WebサーバーをMultiAZ構成で冗長化して、Application Load Balancer(ALB)を使って負荷分散をしてみましょう!
AMIを取得する
同じ構成のサーバーを複数作る場合、インスタンスからAMIを取得するとベースのテンプレートとして扱う事が出来るため、非常に便利です。
先程作成したインスタンスにて、OS起動時にnginxが起動されるようにsystemctl enalbe nginxをしてあげます。
$ sudo systemctl enable nginx
AWSマネジメントコンソールに戻り、インスタンスを右クリックして、インスタンスからAMIを作成していきます。
暫くするとAMIが作成されていることを確認できますので、AutoScalingで必要な「Launch Template」を作っていきます。
設定項目は下記の5点、名前、AMI、インスタンスタイプ、キーペアとSecurity Groupを設定します。
作成が終わりましたら一旦はOKです。AutoSclaingとALBの作成手順に行きましょう。
AutoScalingとALBを作る
最後にシメのAutoScalingを作っていきます。 AutoScalingは名前の通りのサービスですが、ロードバランサーと連携できたり、サービスの負荷に応じてEC2をスケーリングさせたりできるサービスです。
AutoScalingグループを作成から、グループ名と先程作成した起動テンプレートを指定します。
インスタンスを起動するサブネットはプライベートサブネットとしたいため、サブネット選択でプライベートサブネットを選択します。
続いてロードバランシングです。AutoScalingで起動されたインスタンスとロードバランサーの連携をする設定をしてきます。
今回は新たにApplication Load Balancerを作成したいため、Attach to a new load balancerを選択して行き、ALBを選択していきます。
ここで一点注意ですが、先程EC2のサブネットをプライベートサブネットにしたため、ロードバランサーのスキームが「Internal」となってしまっています。今回はALBはパブリックサブネットに配置したいため、Internet-factingにして、サブネット選択でパブリックサブネットを選択してあげます。
次にグループサイズとスケーリングポリシーについて設定します。一旦はMultiAZ構成に出来れば良いかなと思うので、希望する台数、最小、最大キャパシティを2にします。
AutoScaling作成後、しばらくするとEC2インスタンスが2台立ち上がってきていることを確認できます! ここまで理解して作成できたら、もう一人前です。
お作り頂いたAWS環境を見て、こんな感じの構成図っぽい構成を取れているかを確認してみてください。
動作確認
早速動作確認をしていきましょう。まずはターゲットグループのターゲットにEC2が2台起動されていて、ステータスがhealthyであることを確認できます。
ロードバランサー一覧画面から、ロードバランサーのURLを取得する事ができるので、こちらのURLを開いてブラウザで開いてみてください。
Welcome to nginx on Amazon Linux!の画面が表示されたら成功です!お疲れ様でした。
次のステップ
まずは動く物を作って体験して、その後にどのような仕組みで動いているのかを観察することが重要だと思うので、ぜひ作成頂いたリソースを見て深掘りしてみてください。
また、次の学習へのステップとして、今回作成したりソースを使って考察・改善出来る点をいくつか書いてみましたので、是非挑戦してみてください。
- WebサーバーであるEC2はPrivate Subnetに配置しているが、ALBからアクセス出来るのはなぜだろう?(ALBはどのような挙動をするのだろう?)
- ALBとEC2のSecurity Groupをチューニングする
- AutoScalingポリシーを設定して、負荷に応じてインスタンスを増減させる
- NAT Gatewayを使ってみる
- AWS Systems ManagerのSession Manager機能を使ってSSHポートを空けずにサーバーに入る
- CI/CD環境を整える
- Nginx部分を実際のアプリケーションにしてみる
- Infrastructure as Codeに挑戦してみる
- スポットインスタンスを使ってみる
- RDS(or DynamoDB)を使ったアプリケーション開発をしてみる
re:Invent 2020 開催中です!
毎年ラスベガスで開催される技術イベントのre:Invent、今年はオンラインで開催中です!
re:Inventで毎年開催されるSecurity JAMやAWS Gamedayはゲーム感覚でAWSを楽しく学べるイベントなので、是非オンライン開催の今年に挑戦してみてください!
まとめ
初心者向けということで、鉄板的なネットワーク+AutoScaling+ALB+EC2を作ってみました。
AWSは作って壊してを繰り返せる環境を提供してくれていますので、個人としての学習はもちろん、実際のプロジェクトでの導入の際にもあまり堅くならずに、作って壊してを繰り返して改善してみてはいかがでしょうか。